package com.zrkizzy.linkedlist;

import java.time.LocalDate;

/**
 * 203. 移除链表元素
 *
 * @author zhangrongkang
 * @since 2022/11/14
 * @see <a href="https://leetcode.cn/problems/remove-linked-list-elements/">https://leetcode.cn/problems/remove-linked-list-elements/</a>
 */
public class 移除链表的元素 {
    class ListNode {
        int val;
        ListNode next;

        ListNode() {}
        ListNode(int val) {
            this.val = val;
        }
        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }


    /**
     * 双指针 + 迭代
     */
    class Solution01 {
        public ListNode removeElements(ListNode head, int val) {
            // 有可能会删除头结点，因此需要定义一个新的链表
            ListNode node = new ListNode(0);
            node.next = head;
            // 定义双指针
            ListNode pre = node, cur = head;

            // 查看当前链表
            while (cur != null) {
                // 如果当前节点值与目标值相同则删除当前节点
                if (cur.val == val) {
                    pre.next = cur.next;
                } else {
                    // 否则只需要将前一个节点向下移动即可
                    pre = pre.next;
                }
                // 当前指针向后移动
                cur = cur.next;
            }

            return node.next;
        }
    }

    /**
     * 递归 + 覆盖节点值
     */
    class Solution02 {
        // 不断的覆盖当前节点（从头到尾，从尾到头）
        public ListNode removeElements(ListNode head, int val) {
            // 递归到底的情况
            if (head == null) {
                return null;
            }
            // 不断递归去寻找下一个节点直到尾节点，重新对节点进行赋值
            head.next = removeElements(head.next, val);
            // 根据当前节点值判断需要返回哪些节点
            return head.val == val ? head.next : head;
        }
    }

    public static void main(String[] args) {
        LocalDate startTime = LocalDate.now().plusDays(-7);
        System.out.println(startTime);
        startTime = LocalDate.now().plusDays(-1);
        System.out.println(startTime);
    }
}

